/**
 * Created by njb on 2017/10/11.
 */
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: {
        app: './src/index.js',
        vendor: [
            'lodash'
        ]
    },
    output: {
        filename: '[name].[chunkhash].js',
        path: path.resolve(__dirname, 'dist'),
        publicPath: ""

        // library: "", // string,
        // 导出库(exported library)的名称

        /* 高级输出配置（点击显示） */
        // pathinfo: true, // boolean
        // 在生成代码时，引入相关的模块、导出、请求等有帮助的路径信息。

        // chunkFilename: "[id].js",
        // chunkFilename: "[chunkhash].js", // 长效缓存(/guides/caching)
        // 「附加分块(additional chunk)」的文件名模板

        // jsonpFunction: "myWebpackJsonp", // string
        // 用于加载分块的 JSONP 函数名

        // sourceMapFilename: "[file].map", // string
        // sourceMapFilename: "sourcemaps/[file].map", // string
        // 「source map 位置」的文件名模板

        // devtoolModuleFilenameTemplate: "webpack:///[resource-path]", // string
        // 「devtool 中模块」的文件名模板

        // devtoolFallbackModuleFilenameTemplate: "webpack:///[resource-path]?[hash]", // string
        // 「devtool 中模块」的文件名模板（用于冲突）

        // umdNamedDefine: true, // boolean
        // 在 UMD 库中使用命名的 AMD 模块

        // crossOriginLoading: "use-credentials" // 枚举
        // crossOriginLoading: "anonymous",
        // crossOriginLoading: false,
        // 指定运行时如何发出跨域请求问题


        /* 专家级输出配置（自行承担风险） */

        // devtoolLineToLine: {
        //     test: /\.jsx$/
        // },
        // 为这些模块使用 1:1 映射 SourceMaps（快速）

        // hotUpdateMainFilename: "[hash].hot-update.json", // string
        // 「HMR 清单」的文件名模板

        // hotUpdateChunkFilename: "[id].[hash].hot-update.js", // string
        // 「HMR 分块」的文件名模板

        // sourcePrefix: "\t", // string
        // 包内前置式模块资源具有更好可读性

    },
    module:{
        rules:[
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                // include: [
                //     path.resolve(__dirname, "app")
                // ],
                // exclude: [
                //     path.resolve(__dirname, "app/demo-files")
                // ],
                // 这里是匹配条件，每个选项都接收一个正则表达式或字符串
                // test 和 include 具有相同的作用，都是必须匹配选项
                // exclude 是必不匹配选项（优先于 test 和 include）
                // 最佳实践：
                // - 只在 test 和 文件名匹配 中使用正则表达式
                // - 在 include 和 exclude 中使用绝对路径数组
                // - 尽量避免 exclude，更倾向于使用 include

                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env']
                    }
                }
            },
            {
                test:/\.css$/, //处理css样式
                use:[
                    'style-loader',
                    'css-loader'
                ]
            },
            {
                test: /\.(png|svg|jpg|gif)$/, //图片处理
                use: [
                    'file-loader'
                ]
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/,//字体样式处理
                use: [
                    'file-loader'
                ]
            },
            {
                test: /\.(csv|tsv)$/,
                use: [
                    'csv-loader'
                ]
            },
            {
                test: /\.xml$/,
                use: [
                    'xml-loader'
                ]
            }
        ]
    },

    // context: __dirname, // string（绝对路径！）
    // webpack 的主目录
    // entry 和 module.rules.loader 选项
    // 相对于此目录解析


    // devServer: {
    //     proxy: { // proxy URLs to backend development server
    //         '/api': 'http://localhost:3000'
    //     },
    //     contentBase: path.join(__dirname, 'public'), // boolean | string | array, static file location
    //     compress: true, // enable gzip compression
    //     historyApiFallback: true, // true for index.html upon 404, object for multiple paths
    //     hot: true, // hot module replacement. Depends on HotModuleReplacementPlugin
    //     https: false, // true for self-signed, object for cert authority
    //     noInfo: true, // only errors & warns on hot reload
    //     // ...
    // },

    plugins: [
        new CleanWebpackPlugin(['dist']),
        new HtmlWebpackPlugin({
             title: 'Production'
        })
    ],

    /* 高级配置（点击展示） */
    // resolveLoader: { /* 等同于 resolve */ }
    // // 独立解析选项的 loader
    //
    // parallelism: 1, // number
    // // 限制并行处理模块的数量
    //
    // profile: true, // boolean
    // // 捕获时机信息
    //
    // bail: true, //boolean
    // // 在第一个错误出错时抛出，而不是无视错误。
    //
    // cache: false, // boolean
    // // 禁用/启用缓存
    //
    // watch: true, // boolean
    // 启用观察

    // watchOptions: {
    //     aggregateTimeout: 1000, // in ms
    //     // 将多个更改聚合到单个重构建(rebuild)
    //
    //     poll: true,
    //     poll: 500, // 间隔单位 ms
    //     // 启用轮询观察模式
    //     // 必须用在不通知更改的文件系统中
    //     // 即 nfs shares（译者注：Network FileSystem，最大的功能就是可以透過網路，讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 ( share file )）
    // },

    // node: {
    //     // Polyfills and mocks to run Node.js-
    //     // environment code in non-Node environments.
    //
    //     console: false, // boolean | "mock"
    //     global: true, // boolean | "mock"
    //     process: true, // boolean
    //     __filename: "mock", // boolean | "mock"
    //     __dirname: "mock", // boolean | "mock"
    //     Buffer: true, // boolean | "mock"
    //     setImmediate: true // boolean | "mock" | "empty"
    // },

    // recordsPath: path.resolve(__dirname, "build/records.json"),
    // recordsInputPath: path.resolve(__dirname, "build/records.json"),
    // recordsOutputPath: path.resolve(__dirname, "build/records.json"),
    // TODO
 };